home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
D.I.S.C. 4
/
D.I.S.C. 4.adf
/
sources
/
codemfm.s
< prev
Wrap
Text File
|
1988-01-19
|
3KB
|
119 lines
;Code-MFM
;By duke/L4 for DISC #4
jmp Start
org $45000
load $45000
S:
Start:
code_track:
movem.l d0-d7/a0-a5,-(a7)
lea s(pc),a5
move.l datapt(pc),a0
lea trackbuff(pc),a1
move.l #$55555555,d5 ;mask for even bits
move.w #11,d7 ;code 11 sectors
clr.w d6 ;sector-nummer
code_loop:
lea 8(a1),a2
move.l a1,a3
move.l #$ff000000,d0 ;format-sign
moveq #0,d1
move.w track(pc),d1
swap d1
or.l d1,d0 ;store track-nummer (0-159)
move.w d6,d1
asl.w #8,d1
or.w d1,d0 ;store sector-nummer (0-10)
or.w d7,d0 ;store no. of sectors until gap (11-1)
clr.l (a1)+ ;store coded zeros
move.l #$44894489,(a1)+;syncs
bsr.l code_long ;code infoblock
move.l d0,(a1)+ ;info (odd)
move.l d1,(a1)+ ;info (even)
move.w #8-1,d2
store_label:
clr.l (a1)+ ;store sector-label-field
dbf d2,store_label
moveq #0,d0
move.w #10-1,d2 ;checksum over 40 bytes
header_check:
move.l (a2)+,d1
eor.l d1,d0
dbf d2,header_check
bsr.l code_long ;code header-checksum
move.l d0,(a1)+ ;store headercheck (odd)
move.l d1,(a1)+ ;store headercheck (even)
lea 16(a2),a2 ;buffer for odd data-bits
lea 512(a2),a4 ;buffer for even data-bits
move.w #128-1,d2
code_data:
move.l (a0)+,d0
bsr.l code_long
move.l d0,(a2)+ ;store odd bits
move.l d1,(a4)+ ;store even bits
dbf d2,code_data
lea 8(a1),a2 ;skip space for data-checksum
moveq #0,d0 ;clear checksum
move.w #256-1,d2
data_check:
move.l (a2)+,d1
eor.l d1,d0 ;calc sum
dbf d2,data_check
bsr.l code_long ;code data-checksum
move.l d0,(a1)+
move.l d1,(a1)+
clr.w d4 ;set tact-bits for infoblock
bsr.l settacts
lea 4(a3),a3 ;skip syncs
move.w #270-1,d4 ;set tact-bits for 270 longwords
bsr.l settacts
;
adda.w #1024,a1 ;skip coded data-bits
addq.w #1,d6
subq.w #1,d7
bne.l code_loop ;code next sector
addi.l #$1600,datapt-s(a5)
movem.l (a7)+,d0-d7/a0-a5
Rts
settacts:
move.b -1(a3),d3 ;byte from longword before
not.b d3 ;invert byte
andi.l #1,d3 ;mask bit 0
ror.l #1,d3 ;shift bit 0 to bit 31
move.l (a3),d0 ;fetch longword
move.l d0,d1
eor.l d5,d0
move.l d0,d2
lsl.l #1,d0
lsr.l #1,d2
or.l d3,d2 ;set bit 31 if necessary
and.l d2,d0
or.l d1,d0
move.l d0,(a3)+
dbf d4,settacts
Rts
code_long: ;code longword
move.l d0,d1
lsr.l #1,d0
and.l d5,d0 ;odd
and.l d5,d1 ;even
Rts
track: dc.w 2
datapt: dc.l data
trackgap: ;save data from trackgap on (if there're
blk.b 800,$aa ;any errors try bigger gap)
trackbuff:
blk.b 13000,$aa
data: ;store data which you want to code here